#include <iostream>
#include <vector>

using namespace std;
class Solution
{
public:
    bool isUnique(string astr)
    {
        if (astr.size() > 26)
        {
            return false;
        }
        if (astr.size() == 0)
        {
            return true;
        }
        sort(astr.begin(), astr.end());
        for (int i = 0; i < astr.size() - 1; i++)
        {
            if (astr[i] == astr[i + 1])
            {
                return false;
            }
        }
        return true;
    }

    bool isUnique(string astr)
    {
        int bitMap = 0x00000001; // 除了最后一位, 其余位置用于记录特定的字母是否出现过, 当然不是所有的位置都使用上了, 因为字母只有 26 个
        for (char c : astr)
        {
            int mask = 0x00000001;
            // + 1 是为了避开最后一位, 这样即使是字母 `a` 也至少会左移一位
            int offset = c - 'a' + 1;
            // 只有 1 & 1 == 1, 所以如果按位与之后的值不为 0 , 说明相同的 offset 位置上的字节在之前的循环中被按位或成了 1
            if (!((mask << offset) & bitMap))
            {
                // 将 offset 位置按位或成 1
                bitMap |= (mask << offset);
            }
            else
            {
                return false;
            }
        }
        return true;
    }
};

int main()
{
    Solution s;
    return 0;
}